#include "common.h"

#include "Arduino.h"
#include <Adafruit_GFX.h>      
#include <Adafruit_ST7735.h> 
int initR=0;
SPIClass SPI_2(LCD_MOSI,LCD_MISO,LCD_SCK,-1);
Adafruit_ST7735* tft = nullptr;


//GPIO初始化
void initPin(){
  pinMode(LCD_BLK,OUTPUT);
  pinMode(LCD_CS,OUTPUT);
  pinMode(LCD_5V,OUTPUT);

  digitalWrite(LCD_5V, HIGH);
  digitalWrite(LCD_BLK, HIGH);
  digitalWrite(LCD_CS, LOW);
  
}

//屏幕初始化
void initLCD(){
// INITR_GREENTAB
// INITR_144GREENTAB
// INITR_HALLOWING
// INITR_MINI160x80
// INITR_MINI160x80_PLUGIN
// INITR_BLACKTAB
// INITR_HALLOWING
// tft->initR(INITR_MINI160x80_PLUGIN);
  initR++;
  if(initR>=15)
    initR=0;
  if(initR>7){
    tft =new Adafruit_ST7735(-1,LCD_DC, LCD_MOSI, LCD_SCK,LCD_RES);
  }
  else{
    tft =new Adafruit_ST7735(&SPI_2,-1, LCD_DC, LCD_RES); 
  }
  if((initR%8)==7)
    tft->initB();
  else
    tft->initR(initR%8);
  // tft->setTextWrap(true);
  tft->setFont(NULL);
  tft->setRotation(1);
  tft->fillScreen(ST7735_BLACK);
}

void loading(){
  tft->fillScreen(ST77XX_RED);
  // 绘制静态元素
  // tft->setTextColor(ST77XX_WHITE);
  // tft->setTextSize(1);
  // tft->setCursor(65, 60);
  // tft->print(initR);
  
  // 进度条外框
  tft->drawRect(20, 40, 120, 15, ST77XX_WHITE);

  // 动态进度条动画
  for (int i = 0; i <= 100; i+=2) {
    int barWidth = map(i, 0, 100, 0, 118);  // 计算填充长度
    tft->fillRect(21, 41, barWidth, 13, ST77XX_GREEN);  // 绿色填充
    
    // 显示百分比
    tft->fillRect(65, 60, 30, 10, ST77XX_BLACK); // 清除旧文本
    tft->setCursor(65, 60);
    tft->print(initR);
    // tft->print("%");
    
    delay(10);  // 控制动画速度
  }
  // tft->fillScreen(ST77XX_BLACK);
}

void setup() {
  Serial.setTx(SERIAL_TX);
  Serial.setRx(SERIAL_RX);
  Serial.begin(115200);

  initPin();

}

void loop() {
  initLCD();

  loading();
  delay(1000);
}

/*****************************************/

// // ST7735引脚定义
// #define LCD_BLK PA2
// #define LCD_CS  PB0
// #define LCD_RES PB1
// #define LCD_DC  PB2
// #define LCD_SCK PB10
// #define LCD_MOSI PB11

// // ST7735命令定义
// #define ST7735_NOP     0x00
// #define ST7735_SWRESET 0x01
// #define ST7735_CASET   0x2A    // 设置列地址
// #define ST7735_RASET   0x2B    // 设置行地址
// #define ST7735_RAMWR   0x2C    // 写入显存
// #define ST7735_MADCTL  0x36    // 屏幕方向控制

// // 屏幕尺寸（根据你的ST7735型号调整）
// #define TFT_WIDTH  128
// #define TFT_HEIGHT 160

// // 颜色定义（RGB565格式）
// #define ST7735_RED   0xF800
// #define ST7735_GREEN 0x07E0
// #define ST7735_BLUE  0x001F
// #define ST7735_WHITE 0xFFFF
// #define ST7735_BLACK 0x0000

// // 初始化GPIO
// void setupPins() {
//   pinMode(LCD_BLK, OUTPUT);
//   pinMode(LCD_CS, OUTPUT);
//   pinMode(LCD_RES, OUTPUT);
//   pinMode(LCD_DC, OUTPUT);
//   pinMode(LCD_SCK, OUTPUT);
//   pinMode(LCD_MOSI, OUTPUT);

//   digitalWrite(LCD_CS, HIGH);  // 默认不选中
//   digitalWrite(LCD_DC, HIGH);  // 默认数据模式
//   digitalWrite(LCD_BLK, HIGH); // 开启背光
// }

// // 通过软件SPI发送1字节
// void SPI_write(uint8_t data) {
//   for (uint8_t i = 0; i < 8; i++) {
//     digitalWrite(LCD_SCK, LOW);
//     digitalWrite(LCD_MOSI, (data & 0x80) ? HIGH : LOW);
//     digitalWrite(LCD_SCK, HIGH);
//     data <<= 1;
//   }
// }

// // 发送命令
// void writeCommand(uint8_t cmd) {
//   digitalWrite(LCD_DC, LOW);   // DC=0表示命令
//   digitalWrite(LCD_CS, LOW);    // 选中屏幕
//   SPI_write(cmd);
//   digitalWrite(LCD_CS, HIGH);   // 取消选中
// }

// // 发送数据
// void writeData(uint8_t data) {
//   digitalWrite(LCD_DC, HIGH);   // DC=1表示数据
//   digitalWrite(LCD_CS, LOW);
//   SPI_write(data);
//   digitalWrite(LCD_CS, HIGH);
// }

// // 发送16位数据（用于颜色）
// void writeData16(uint16_t data) {
//   writeData(data >> 8);     // 先发高8位
//   writeData(data & 0xFF);   // 再发低8位
// }

// // 设置显示区域（x0,y0为起点，x1,y1为终点）
// void setAddrWindow(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1) {
//   writeCommand(ST7735_CASET);  // 列地址设置
//   writeData16(x0);
//   writeData16(x1);

//   writeCommand(ST7735_RASET);  // 行地址设置
//   writeData16(y0);
//   writeData16(y1);

//   writeCommand(ST7735_RAMWR);  // 开始写入显存
// }

// // 初始化ST7735
// void ST7735_init() {
//   // 硬件复位
//   digitalWrite(LCD_RES, HIGH);
//   delay(5);
//   digitalWrite(LCD_RES, LOW);
//   delay(20);
//   digitalWrite(LCD_RES, HIGH);
//   delay(150);

//   // 初始化命令序列（简化版，具体需参考你的屏幕手册）
//   writeCommand(0x11);    // 退出睡眠模式
//   delay(120);

//   writeCommand(0x3A);    // 设置颜色模式
//   writeData(0x05);       // 16位RGB565

//   writeCommand(0x29);    // 开启显示
// }

// // 画一个点（x,y），颜色为color（RGB565）
// void drawPixel(uint8_t x, uint8_t y, uint16_t color) {
//   if (x >= TFT_WIDTH || y >= TFT_HEIGHT) return;  // 超出范围不画

//   setAddrWindow(x, y, x, y);  // 设置单点区域
//   writeData16(color);         // 写入颜色
// }

// // 清屏（全黑）
// void clearScreen() {
//   setAddrWindow(0, 0, TFT_WIDTH - 1, TFT_HEIGHT - 1);
//   for (uint32_t i = 0; i < TFT_WIDTH * TFT_HEIGHT; i++) {
//     writeData16(ST7735_BLACK);
//   }
// }

// // Arduino初始化
// void setup() {
//   setupPins();      // 初始化GPIO
//   ST7735_init();    // 初始化屏幕
//   clearScreen();    // 清屏
// }

// // 主循环（测试画点）
// void loop() {
//   // 画红色对角线
//   for (uint8_t i = 0; i < TFT_WIDTH; i++) {
//     drawPixel(i, i, ST7735_RED);
//     delay(10);
//   }

//   // 画绿色对角线
//   for (uint8_t i = 0; i < TFT_HEIGHT; i++) {
//     drawPixel(i, TFT_HEIGHT - 1 - i, ST7735_GREEN);
//     delay(10);
//   }

//   delay(1000);
//   clearScreen();  // 清屏重新开始
// }